package main

import "fmt"

func f(n int) (r int) {
	defer func() {
		r += n
		recover()
	}()

	var f func()

	defer f()
	f = func() {
		r += 2
	}
	return n + 1
}

func main() {
	fmt.Println(f(3))
}

//进入 f(3) 函数。
//在函数开头,我们定义了一个 defer 匿名函数,它会在 f 函数返回之前执行。
//接下来,我们定义了一个名为 f 的函数变量,并在 defer 语句中调用它。此时,f 变量还没有被赋值,所以调用它会导致 panic。
//然后,我们将一个匿名函数赋值给 f 变量。
//f 函数返回 n + 1,即 4。
//在 f 函数返回之前,之前定义的 defer 匿名函数会执行。这个匿名函数会将 r 的值加上 n,即 3,然后调用 recover 函数。由于 recover 会捕获之前的 panic,因此这个 panic 不会导致程序崩溃。
//最终,f(3) 函数返回 7。
